﻿/*
 * Crée par SharpDevelop.
 * Utilisateur: eldunkerquois
 * Date: 11/07/2011
 * Heure: 17:02
 * 
 * Pour changer ce modèle utiliser Outils | Options | Codage | Editer les en-têtes standards.
 */
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web.Services;
using System.Diagnostics;

using Db4objects.Db4o;
using Db4objects.Db4o.CS;
using openxml.butter.controller;
using openxml.butter.definition;

namespace OpenXmlWebBetter.service
{
    /// <summary>
    /// Description of WebService1
    /// </summary>
    [WebService
     (Name = "OpenXml Butter Service",
      Description = "OXB Studio WebService",
      Namespace = "http://www.studios-toockies.net/service/openxmlbutter"
     )
    ]
    public class WebService1 : WebService
    {
        private IObjectServer _server;
        private IObjectContainer _db;
        private Boolean flgOne = false ;
        private String erreur = "";

        #region Start/End
        /// <summary>
        /// Contructeur ouvrant la db connexion
        /// </summary>
        public WebService1()
        {
            
            Trace.WriteLine("new Webservice1");
            string filePath = ConfigurationManager.AppSettings["DatabaseFileName"];
            
            try
            {
                
                //ouvrir le serveur
                _server = Db4oClientServer.OpenServer(filePath, 0);
                Trace.WriteLine("Server ouvert");

                try
                {
                    
                    //ouvrir la base de données
                    _db = _server.OpenClient();
                    Trace.WriteLine("Client ouvert");
                    

                }
                catch (Exception excp)
                {
                    Trace.WriteLine("Pb lors de l'ouverture client : {0} ", excp.Message);
                    erreur = "!" + excp.Message;
                    _server.Close();
                    _server = null;
                }
                flgOne = true;
            }
            catch (Exception excp2)
            {
                Trace.WriteLine("Impossiblie d'ouvrir le server :{0}", excp2.Message);
                //erreur = "!!" + excp2.Message;
            }
        }

        /// <summary>
        /// Dispose ferme la connexion
        /// </summary>
        /// <param name="disposing"></param>
        protected override void Dispose(bool disposing)
        {
            base.Dispose(disposing);
            Trace.WriteLine("Fin du service");
            if (_server != null)
            {
                try
                {
                    if (_db != null)
                    {
                        _db.Close();
                        _db = null;
                        Trace.WriteLine("Client fermé");
                    }
                }
                catch (Exception excp)
                {
                    Trace.WriteLine("Pb de fermeture client : {0}", excp.Message);
                }
                finally
                {
                    _server.Close();
                    _server = null;
                    Trace.WriteLine("server fermé!");
                }
            }

        }

        #endregion

        #region Query
        [WebMethod(Description = "Liste des associations Control-DataItem d'un modèle de document")]
        public List<DataControlAssociation> getDocumentAssociations(String code)
        {
            List<DataControlAssociation> assos = DataFactory.Instance.getDocumentAssociations(_db, code);
            Console.WriteLine("nb assos : " + assos.Count);

            return assos;
        }

        [WebMethod(Description = "Liste des modèles de données")]
        public List<DataTemplate> getDataTemplates()
        {
            List<DataTemplate> liste = DataFactory.Instance.get<DataTemplate>(_db);

            Console.WriteLine("nb tpls : " + liste.Count);


            return liste;
        }

        [WebMethod(Description = "Un modèle de données")]
        public DataTemplate getDataTemplate(String code)
        {

            DataTemplate dt = DataFactory.Instance.loadDataTemplate(_db, code);
            if (dt != null)
            {
                Console.WriteLine("Data Template dont le code est '{0}' ", code);
            }
            else
            {
                Console.WriteLine("Pas de data template '{0}'", code);
            }

            return dt;
        }

        [WebMethod(Description = "Données d'un modèle de données")]
        public List<DataItem> getDataTemplateItems(String code)
        {
            List<DataItem> items = DataFactory.Instance.getDataTemplateItems(_db, code);
            Console.WriteLine("nb data items : " + items.Count);
            return items;
        }

        [WebMethod(Description = "Liste des modèles de données associés au modèle de document")]
        public List<DataTemplate> getDocumentDataTemplates(String code)
        {
            List<DataTemplate> tpls = DataFactory.Instance.getDocumentDataTemplates(_db, code);
            Console.WriteLine("NB de tpls = " + tpls.Count);
            return tpls;
        }

        [WebMethod(Description = "Liste des modèles de documents")]
        public List<DocumentTemplate> getDocumentTemplates()
        {
            try
            {
                List<DocumentTemplate> liste = DataFactory.Instance.get<DocumentTemplate>(_db);
                Console.WriteLine("nb tpls : " + liste.Count);

                return liste;
            }
            catch (Exception e)
            {
                String error = "Server = null : " + (this._server == null) + " - erreur :"  + this.erreur + " ; " + e.Message;
                throw new Exception(error);
            }
        }


        [WebMethod(Description = "Un modèle de de document")]
        public DocumentTemplate getDocumentTemplate(String code)
        {
            DocumentTemplate doc = DataFactory.Instance.get<DocumentTemplate>(_db, code);
            Console.WriteLine("Document Template dont le code est '" + code + "' : " +  (doc != null) );

            return doc;
        }
        #endregion

        #region Associer
        [WebMethod(Description = "Associer une donnée à un control")]
        public Boolean associerControlData(String codeDocument, String controlId, String dataUid)
        {
            try
            {
                DataFactory.Instance.associateControlToData(_db, codeDocument, controlId, dataUid);
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine("Pb lors de l'association Control-Donnée :" + e.Message);
                return false;
            }
        }

        [WebMethod(Description = "Associer un modèle de données à un modèle de document")]
        public Boolean associerTemplate(String codeDocument, String codeData)
        {
            try
            {
                DataFactory.Instance.associateTemplate(_db, codeDocument, codeData);
                return true;
            }
            catch (Exception e)
            {
                Console.WriteLine("Impossible d'associer les données au modèle de document : " + e.Message);
                return false;
            }
        }

        #endregion


        #region Create
        [WebMethod(Description = "Créer un data item au sein d'un data template")]
        public DataItem createDataItem(String code, String description, String exemple, String dataTemplateCode)
        {
            DataItem item = DataFactory.Instance.createDataItem(_db, code, description, exemple, dataTemplateCode);
            Console.WriteLine("Data Item Créé");
            return item;
        }


        [WebMethod(Description = "Créer un datatemplate, le code doit être unique")]
        public DataTemplate createDataTemplate(String code, String description)
        {

            try
            {
                DataTemplate dt = DataFactory.Instance.createTemplate<DataTemplate>(_db, code, description);
                Console.WriteLine("Data Template Créé");
                return dt;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return null;
            }

        }

        [WebMethod(Description = "Créer un document template, le code doit être unique")]
        public DocumentTemplate createDocumentTemplate(String code, String description)
        {

            try
            {
                DocumentTemplate dt = DataFactory.Instance.createDocumentTemplate(_db, code, description);
                System.Diagnostics.Trace.WriteLine("Document Template Créé:" + (dt.BinaryContent == null) );
                
                return dt;
            }
            catch (Exception e)
            {
                System.Diagnostics.Trace.WriteLine(e.Message);
                return null;
            }

        }

        #endregion

    }
}
